package com.sromku.simple.fb.actions; import org.json.JSONException; import org.json.JSONObject; import com.facebook.FacebookRequestError; import com.facebook.HttpMethod; import com.facebook.Request; import com.facebook.RequestAsyncTask; import com.facebook.Response; import com.facebook.Session; import com.facebook.model.GraphObject; import com.sromku.simple.fb.Permission; import com.sromku.simple.fb.SessionManager; import com.sromku.simple.fb.entities.Publishable; import com.sromku.simple.fb.listeners.OnPublishListener; import com.sromku.simple.fb.listeners.OnReopenSessionListener; import com.sromku.simple.fb.utils.Errors; import com.sromku.simple.fb.utils.Errors.ErrorMsg; import com.sromku.simple.fb.utils.Logger; public class PublishAction extends AbstractAction { private OnPublishListener mOnPublishListener; private Publishable mPublishable; private String mTarget = "me"; public PublishAction(SessionManager sessionManager) { super(sessionManager); } public void setPublishable(Publishable publishable) { mPublishable = publishable; } public void setTarget(String target) { mTarget = target; } public void setOnPublishListener(OnPublishListener onPublishListener) { mOnPublishListener = onPublishListener; } @Override protected void executeImpl() { if (sessionManager.isLogin(true)) { if (sessionManager.canMakeAdditionalRequest()) { // if we defined the publish permission /* * We need also add one more check of next case: - if we gave * extended permissions in runtime, but we don't have these * permissions in the configuration */ if (configuration.getPublishPermissions().contains(mPublishable.getPermission().getValue()) || sessionManager.getActiveSessionPermissions().contains(mPublishable.getPermission().getValue())) { if (mOnPublishListener != null) { mOnPublishListener.onThinking(); } /* * Check if session to facebook has needed publish * permission. If not, we will ask user for this permission. */ if (!sessionManager.getActiveSessionPermissions().contains(mPublishable.getPermission().getValue())) { sessionManager.getSessionStatusCallback().setOnReopenSessionListener(new OnReopenSessionListener() { @Override public void onSuccess() { publishImpl(mPublishable, mOnPublishListener); } @Override public void onNotAcceptingPermissions(Permission.Type type) { String reason = Errors.getError(ErrorMsg.CANCEL_PERMISSIONS_PUBLISH, String.valueOf(configuration.getPublishPermissions())); Logger.logError(PublishAction.class, reason, null); if (mOnPublishListener != null) { mOnPublishListener.onFail(reason); } } }); sessionManager.extendPublishPermissions(); } else { publishImpl(mPublishable, mOnPublishListener); } } else { String reason = Errors.getError(ErrorMsg.PERMISSIONS_PUBLISH, mPublishable.getPermission().getValue()); Logger.logError(PublishAction.class, reason, null); if (mOnPublishListener != null) { mOnPublishListener.onFail(reason); } } } else { return; } } else { if (mOnPublishListener != null) { String reason = Errors.getError(ErrorMsg.LOGIN); Logger.logError(PublishAction.class, reason, null); mOnPublishListener.onFail(reason); } } } private void publishImpl(Publishable publishable, final OnPublishListener onPublishListener) { Session session = sessionManager.getActiveSession(); Request request = new Request(session, mTarget + "/" + publishable.getPath(), publishable.getBundle(), HttpMethod.POST, new Request.Callback() { @Override public void onCompleted(Response response) { GraphObject graphObject = response.getGraphObject(); if (graphObject != null) { JSONObject graphResponse = graphObject.getInnerJSONObject(); String postId = null; try { postId = graphResponse.getString("id"); } catch (JSONException e) { Logger.logError(PublishAction.class, "JSON error", e); } FacebookRequestError error = response.getError(); if (error != null) { Logger.logError(PublishAction.class, "Failed to publish", error.getException()); if (onPublishListener != null) { onPublishListener.onException(error.getException()); } } else { if (onPublishListener != null) { onPublishListener.onComplete(postId); } } } else { Logger.logError(PublishAction.class, "The GraphObject in Response of publish action has null value. Response=" + response.toString(), null); if (onPublishListener != null) { onPublishListener.onComplete("0"); } } } }); RequestAsyncTask task = new RequestAsyncTask(request); task.execute(); } }